package com.huangsm.concurrence.atomic;

import java.util.concurrent.atomic.AtomicBoolean;

/**
 * 原子性布尔
 * @author huang
 * @PACKAGE_NAME com.huangsm.concurrence.atomic
 * @PROJECT_NAME concurrence
 * @date 2019/2/15
 */
public class AtomicBooleanDemo {
    /**
     * AtomicBoolean 类为我们提供了一个可以用原子方式进行读和写的布尔值，它还拥有一些先进的原子性操作，比如 compareAndSet()。
     * AtomicBoolean 类位于 java.util.concurrent.atomic 包，完整类名是为 java.util.concurrent.atomic.AtomicBoolean。
     * 本小节描述的 AtomicBoolean 是 Java 8 版本里的，而不是它第一次被引入的 Java 5 版本。
     */
    public static void main(String[] args) {
        //新建一个默认值为false的原子性布尔
        AtomicBoolean atomicBoolean=new AtomicBoolean();
        //设置AtomicBoolean的值
        atomicBoolean.set(false);

        AtomicBoolean atomicBoolean1=new AtomicBoolean(true);

        //获取AtomicBoolean的值
        boolean b = atomicBoolean1.get();
        System.out.println(b);

        //交换AtomicBoolean的值
        boolean oldValue = atomicBoolean1.getAndSet(false);
        System.out.println(oldValue+"newValue:"+atomicBoolean1.get());
        //比较并设置AtomicBoolean的值
        /**
         * compareAndSet() 方法允许你对 AtomicBoolean 的当前值与一个期望值进行比较，如果当前值等于期望值的话，将会对 AtomicBoolean 设定一个新值。compareAndSet() 方法是原子性的，因此在同一时间之内有单个线程执行它。
         * 因此 compareAndSet() 方法可被用于一些类似于锁的同步的简单实现。
         */
        AtomicBoolean atomicBoolean2= new AtomicBoolean(true);

        boolean expectedValue = true;
        boolean newValue      = false;

        boolean wasNewValueSet = atomicBoolean2.compareAndSet(
                expectedValue, newValue);
    }
}
